/**
 * @file key_contorl.h
 * @brief 按键控制模块头文件
 * @version 0.1
 * @date 2024-03-21
 */

#ifndef __KEY_CONTROL_H__
#define __KEY_CONTROL_H__

#include "LNM8F01.h"

/* 按键定义 */
#define KEY_QUANTITY_PIN    PA0DATA    // 数量按键
#define KEY_SPEED_PIN       PA1DATA    // 速度按键
#define KEY_MODE_PIN        PA2DATA    // 模式按键
#define KEY_FUNCTION_PIN    PA3DATA    // 功能按键

/* 按键状态枚举 */
typedef enum {
    KEY_STATE_RELEASED = 0,     // 按键释放状态
    KEY_STATE_DEBOUNCE,         // 消抖状态
    KEY_STATE_SHORT,         	// 短按状态
    KEY_STATE_LONG,       		// 长按状态
		KEY_STATE_REPEAT			// 重复状态
} key_state_enumType_t;

/* 按键返回状态枚举 */
typedef enum {
    KEY_ALREADY_PRO = 0,
		KEY_SHORT_PRESS,
		KEY_LONG_PRESS
} key_return_state_enumType_t;

/* 按键类型枚举 */
typedef enum {
    KEY_TYPE_QUANTITY = 0,     // 数量按键
    KEY_TYPE_SPEED,            // 速度按键
    KEY_TYPE_MODE,             // 模式按键
    KEY_TYPE_FUNCTION          // 功能按键
} key_type_enumType_t;

/* 速度档位枚举 */
typedef enum {
    SPEED_LEVEL_1 = 1,         // 1档
    SPEED_LEVEL_2,             // 2档
    SPEED_LEVEL_3,             // 3档
    SPEED_LEVEL_4,             // 4档
    SPEED_LEVEL_5              // 5档
} speed_level_enumType_t;

/* 模式枚举 */
typedef enum {
    MODE_ALWAYS_ON = 1,        // 常亮模式
    MODE_BLINK,                // 闪烁模式
		MODE_BREATH,               // 呼吸模式
    MODE_FLOW,                 // 流水灯模式  
    MODE_METEOR,               // 流星雨模式
    MODE_WELCOME,              // 迎宾模式
    MODE_RAINBOW               // 彩虹模式
} mode_enumType_t;


/* 按键配置结构体 */
typedef struct {
    uint8_t debounceTime;      // 消抖时间(ms)
		uint8_t shortPressTime;    // 短按时间(ms)
    uint16_t longPressTime;    // 长按时间(ms)
    uint16_t repeatTime;       // 长按重复时间(ms)
} key_config_struct_t;

/* 按键状态结构体 */
typedef struct {
    key_state_enumType_t state;    // 当前状态
    uint16_t pressTime;            // 按下时间
    uint8_t  keyState;             // 返回按键状态
} key_status_struct_t;

/* 按键控制结构体 */
typedef struct {
    uint8_t quantity;              // 数量值(10-150)
    speed_level_enumType_t speed;  // 速度档位(1-5)
    mode_enumType_t mode;          // 模式(1-5)
    uint8_t color;                 // 颜色(1-10)
} key_control_struct_t;

/* 函数声明 */
void init_key_control(void);
void scan_key_status(void);
void process_key_event(void);
uint8_t get_key_quantity(void);
speed_level_enumType_t get_key_speed(void);
mode_enumType_t get_key_mode(void);
uint8_t get_key_color(void);
void set_key_quantity(uint8_t pdat);
void set_key_speed(uint8_t pdat);
void set_key_mode(uint8_t pdat);
void set_key_color(uint8_t pdat);
//display_state_enumType_t get_key_display_state(void);

#endif /* __KEY_CONTROL_H__ */
